# 这个程序的功能是，对inkscape绘制的图形，输出成两个文件，一个是.pdf_tex，另一个是.pdf，将目录下所有的文件合成一张完整的pdf图片，并对合成的图片空白区域剪裁掉。需要安装xelatex和pdf-crop-margins。运行程序，python 本程序。需要将所有图片文件放在figures目录下，另外需要一个tex的模板文件。生成的图形文件另存到一个单独文件夹里，output_pdfs
import os
import subprocess
import shutil
import sys
from pathlib import Path

def process_pdf_tex_files(template_path, input_dir, output_dir):
    """
    处理目录中的所有.pdf_tex文件，使用模板生成PDF并裁剪空白
    
    参数:
    template_path (str): LaTeX模板文件路径
    input_dir (str): 包含.pdf_tex文件的输入目录
    output_dir (str): 输出PDF的目录
    """
    # 创建输出目录
    Path(output_dir).mkdir(parents=True, exist_ok=True)
    
    # 读取模板内容
    with open(template_path, 'r', encoding='utf-8') as f:
        template_content = f.read()
    
    # 检查pdfCropMargins是否安装
    if not check_pdf_crop_installed():
        print("错误: 未找到 pdfCropMargins。请使用以下命令安装:")
        print("pip install pdfCropMargins")
        sys.exit(1)
    
    # 处理所有.pdf_tex文件
    for filename in os.listdir(input_dir):
        if not filename.endswith('.pdf_tex'):
            continue
            
        base_name = os.path.splitext(filename)[0]
        print(f"\n处理文件: {filename}")
        
        # 创建临时目录
        temp_dir = Path(f"temp_{base_name}")
        temp_dir.mkdir(exist_ok=True)
        
        try:
            # 复制必需文件
            input_file = Path(input_dir) / filename
            shutil.copy(input_file, temp_dir)
            
            pdf_file = Path(input_dir) / f"{base_name}.pdf"
            if not pdf_file.exists():
                print(f"警告: 未找到同名PDF文件 {pdf_file.name}")
            else:
                shutil.copy(pdf_file, temp_dir)
            
            # 创建LaTeX文件
            tex_content = template_content.replace(
                r'\input{fig0104.pdf_tex}', 
                f'\\input{{{filename}}}'
            )
            
            tex_filename = f"temp_{base_name}.tex"
            tex_file = temp_dir / tex_filename
            with open(tex_file, 'w', encoding='utf-8') as f:
                f.write(tex_content)
            
            # 编译LaTeX
            compile_tex(temp_dir, tex_filename)
            
            # 裁剪PDF空白
            uncropped_pdf = temp_dir / f"temp_{base_name}.pdf"
            cropped_pdf = temp_dir / f"cropped_{base_name}.pdf"
            
            if uncropped_pdf.exists():
                crop_pdf(uncropped_pdf, cropped_pdf)
                
                # 生成最终输出文件名
                output_filename = f"图{base_name}.pdf"
                pdf_output = Path(output_dir) / output_filename
                
                shutil.copy(cropped_pdf, pdf_output)
                print(f"成功生成裁剪后的PDF: {pdf_output}")
            else:
                print(f"错误: 未生成PDF文件 {uncropped_pdf}")
                
        except Exception as e:
            print(f"处理 {filename} 时出错: {str(e)}")
        finally:
            # 清理临时文件（取消注释以启用）
            # shutil.rmtree(temp_dir, ignore_errors=True)
            pass

def check_pdf_crop_installed():
    """检查pdfCropMargins是否安装"""
    try:
        subprocess.run(
            ["pdf-crop-margins", "--version"],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            check=True
        )
        return True
    except (subprocess.CalledProcessError, FileNotFoundError):
        return False

def crop_pdf(input_pdf, output_pdf):
    """裁剪PDF文件的空白边缘 - 使用新版参数格式"""
    # 新版pdf-crop-margins参数格式
    crop_cmd = [
        "pdf-crop-margins",
        "-p", "0",  # 裁剪所有页面
        "-a", "-10",  # 移除所有边距（四个边都设为0）
        "--samePageSize",  # 保持原页面尺寸
        "-o", str(output_pdf),
        str(input_pdf)
    ]
    
    result = subprocess.run(
        crop_cmd,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        text=True
    )
    
    if result.returncode != 0:
        raise RuntimeError(f"PDF裁剪失败: {result.stderr}")
    
    print(f"已裁剪PDF空白: {input_pdf.name} -> {output_pdf.name}")

def compile_tex(working_dir, tex_file):
    """编译LaTeX文件"""
    cmd = ['xelatex', '-interaction=nonstopmode', tex_file]
    
    result = subprocess.run(
        cmd,
        cwd=working_dir,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        text=True
    )
    
    if result.returncode != 0:
        log_file = working_dir / "compile_error.log"
        with open(log_file, 'w', encoding='utf-8') as f:
            f.write(result.stdout)
            f.write("\n\n===== ERRORS =====\n\n")
            f.write(result.stderr)
        raise RuntimeError(f"LaTeX编译失败。错误日志: {log_file}")

if __name__ == "__main__":
    # 配置路径
    TEMPLATE_PATH = "template.tex"  # 模板文件路径
    INPUT_DIR = "figures"           # 输入目录
    OUTPUT_DIR = "output_pdfs"      # 输出目录
    
    # 执行处理
    process_pdf_tex_files(TEMPLATE_PATH, INPUT_DIR, OUTPUT_DIR)
    print("\n所有文件处理完成!")